<html>
 <head>
  <meta charset="UTF-8">
 </head>
 <body>
  <h1 data-lake-id="o6Rwn" id="o6Rwn"><span data-lake-id="ud510603e" id="ud510603e">典型回答</span></h1>
  <p data-lake-id="u2e8cd65f" id="u2e8cd65f"><br></p>
  <p data-lake-id="uf4715732" id="uf4715732"><span data-lake-id="ua6254d21" id="ua6254d21">一个类从诞生到卸载，大体分为如下几步：</span></p>
  <p data-lake-id="u8d3c895e" id="u8d3c895e"><span data-lake-id="uaa7c694f" id="uaa7c694f">​</span><br></p>
  <p data-lake-id="u533da162" id="u533da162"><img src="https://cdn.nlark.com/yuque/0/2022/png/719664/1669822742133-ad82c487-cc18-4bd2-96c4-8555ce3f8d79.png?x-oss-process=image%2Fwatermark%2Ctype_d3F5LW1pY3JvaGVp%2Csize_27%2Ctext_SmF2YSA4IEd1IFA%3D%2Ccolor_FFFFFF%2Cshadow_50%2Ct_80%2Cg_se%2Cx_10%2Cy_10"></p>
  <p data-lake-id="uaf876a26" id="uaf876a26"><br></p>
  <p data-lake-id="ue5f3f688" id="ue5f3f688"><br></p>
  <p data-lake-id="u409e17e1" id="u409e17e1"><span data-lake-id="uc8ba16d0" id="uc8ba16d0">大的阶段可以分为类的加载、类的使用、以及类的卸载。</span></p>
  <p data-lake-id="u1dbc0768" id="u1dbc0768"><span data-lake-id="u7ae87eac" id="u7ae87eac">​</span><br></p>
  <p data-lake-id="ufc5fe978" id="ufc5fe978"><span data-lake-id="ub4bd8d0e" id="ub4bd8d0e">其中类的加载阶段又分为加载、链接、初始化。其中连接过程又包含了验证、准备和解析。</span></p>
  <p data-lake-id="u56cf4ffc" id="u56cf4ffc"><br></p>
  <h3 data-lake-id="gCY9F" id="gCY9F"><span data-lake-id="u197682f3" id="u197682f3">加载阶段</span></h3>
  <p data-lake-id="ub26002e3" id="ub26002e3"><span data-lake-id="u9966f8d7" id="u9966f8d7">​</span><br></p>
  <p data-lake-id="ucb8ca22b" id="ucb8ca22b"><br></p>
  <h3 data-lake-id="Y1NP8" id="Y1NP8"><span data-lake-id="u79de3c0e" id="u79de3c0e">类使用过程</span></h3>
  <p data-lake-id="u20a9f4c9" id="u20a9f4c9"><span data-lake-id="u75fcec70" id="u75fcec70">类的使用，即是类在加载完毕后，会有代码段来引用该类，如初始化该类的对象，或者通过反射获取该类的元数据。</span></p>
  <p data-lake-id="ua3da56e0" id="ua3da56e0"><span data-lake-id="u1762d253" id="u1762d253">​</span><br></p>
  <h3 data-lake-id="J6oGd" id="J6oGd"><span data-lake-id="uf13e0e8c" id="uf13e0e8c">类卸载过程</span></h3>
  <p data-lake-id="u01aa6e6a" id="u01aa6e6a"><br></p>
  <p data-lake-id="ue7844cfc" id="ue7844cfc"><span data-lake-id="u9aaf6847" id="u9aaf6847">假如说该类满足下面2个条件：</span></p>
  <p data-lake-id="u21202082" id="u21202082"><span data-lake-id="u9fdb5623" id="u9fdb5623">​</span><br></p>
  <ol list="u0452d59c">
   <li fid="u5ea70141" data-lake-id="u0a3d2ee3" id="u0a3d2ee3"><span data-lake-id="ue2541a5e" id="ue2541a5e">该类所有的实例都已被GC回收。</span></li>
   <li fid="u5ea70141" data-lake-id="u4728781e" id="u4728781e"><span data-lake-id="u2943eb67" id="u2943eb67">该类的ClassLoader已经被GC回收。</span></li>
  </ol>
  <p data-lake-id="ua3ddb509" id="ua3ddb509"><br></p>
  <p data-lake-id="u3f3f3838" id="u3f3f3838"><span data-lake-id="u3867c640" id="u3867c640">那么该类会在FULLGC期间从方法区被回收掉。</span></p>
  <p data-lake-id="ud5ce3938" id="ud5ce3938"><span data-lake-id="u5d44b8a2" id="u5d44b8a2">​</span><br></p>
  <p data-lake-id="ua41c54db" id="ua41c54db"><span data-lake-id="ua3146658" id="ua3146658">这个时候，我们需要明白一个问题，我们知道，JVM自带的类加载器因为需要一直加载基础对象，所以JDK自带的基础类是一定不会被回收掉的，那么会有哪些类会被回收掉呢？</span></p>
  <p data-lake-id="u619bca63" id="u619bca63"><span data-lake-id="u448fb6b1" id="u448fb6b1">​</span><br></p>
  <p data-lake-id="ued82b225" id="ued82b225"><span data-lake-id="uddf5d80e" id="uddf5d80e">答案就是那些自定义类加载器一些场景的类会被回收掉，如tomcat，SPI，JSP等临时类，是存活不久的，所以需要来不断回收</span></p>
  <p data-lake-id="u9de34fb0" id="u9de34fb0"><br></p>
  <p data-lake-id="uf6ef2eba" id="uf6ef2eba"><span data-lake-id="uaf094805" id="uaf094805">​</span><br></p>
  <h2 data-lake-id="T2sxZ" id="T2sxZ"><br></h2>
 </body>
</html>